#include"thread.hpp"
#include<memory>
#include<cstdio>
#include<unistd.h>
#include<vector>


// pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
// int tickets = 10000;
// void* getTicket(void* args)
// {
//     std::string username = static_cast<const char*>(args);
//     while(true)
//     {
//         pthread_mutex_lock(&lock);
//         if(tickets > 0)
//         {
//             usleep(1254);//休眠放在printf前面时打印出现了负数(极端情况)
//             printf("%s : 正在进行抢票 : %d\n",username.c_str(),tickets--);
//             pthread_mutex_unlock(&lock);
//         }
//         else{
//             pthread_mutex_unlock(&lock);
//             break;
//         }
//     }
//     return nullptr;
// }
// void test()
// {
//     std::unique_ptr<Thread> thread1(new Thread(getTicket,(void*)"user1",1));
//     std::unique_ptr<Thread> thread2(new Thread(getTicket,(void*)"user2",2));
//     std::unique_ptr<Thread> thread3(new Thread(getTicket,(void*)"user3",3));
//     std::unique_ptr<Thread> thread4(new Thread(getTicket,(void*)"user4",4));
//     thread1->join();
//     thread2->join();
//     thread3->join();
//     thread4->join();
// }


// int tickets1 = 10000;
// class ThreadData
// {
// public:
//     ThreadData(const std::string& threadname,pthread_mutex_t* mutex_p)
//     :threadname_(threadname)
//     ,mutex_p_(mutex_p)
//     {}
//     ~ThreadData()
//     {}
// public:
//     std::string threadname_;
//     pthread_mutex_t* mutex_p_;
// };
// void* getTicket1(void* args)
// {
//     ThreadData* td = static_cast<ThreadData*>(args);
//     while(true)
//     {
//         //加锁和解锁的过程是多个线程串行执行的, 程序变慢了
//         //锁只规定互斥访问, 没有规定必须让谁优先执行
//         //锁就是真正的让多个执行流进行竞争的结果
//         pthread_mutex_lock(td->mutex_p_);
//         if(tickets1 > 0)
//         {
//             usleep(1254);
//             std::cout<<td->threadname_<<" 正在进行抢票: "<<tickets1<<std::endl;
//             tickets1--;
//             //printf("%s : 正在进行抢票 : %d\n",td->threadname_.c_str(),tickets1--);
//             pthread_mutex_unlock(td->mutex_p_);
//         }
//         else{
//             pthread_mutex_unlock(td->mutex_p_);
//             break;
//         }
//         //形成一个订单给用户
//         usleep(1000);
//     }
//     return nullptr;
// }
// void test1()
// {
// #define NUM 4
//     pthread_mutex_t lock;
//     pthread_mutex_init(&lock,nullptr);
//     std::vector<pthread_t> tids(NUM);
//     for(int i = 0;i < NUM;i++)
//     {
//         char buffer[64];
//         snprintf(buffer,sizeof(buffer),"thread %d",i + 1);
//         ThreadData* td = new ThreadData(buffer,&lock);
//         pthread_create(&tids[i],nullptr,getTicket1,td);
//     }
//     for(const auto& tid : tids)
//     {
//         pthread_join(tid,nullptr);
//     }
//     pthread_mutex_destroy(&lock);
// }


pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
int tickets2 = 10000;
void* getTicket2(void* args)
{
    std::string username = static_cast<const char*>(args);
    while(true)
    {
        pthread_mutex_lock(&lock);
        if(tickets2 > 0)
        {
            usleep(1254);
            std::cout<<username<<" 正在进行抢票: "<<tickets2<<std::endl;
            tickets2--;
            pthread_mutex_unlock(&lock);
        }
        else{
            pthread_mutex_unlock(&lock);
            break;
        }
        usleep(1000);
    }
    return nullptr;
}
void test2()
{
    pthread_t t1,t2,t3,t4;
    pthread_create(&t1,nullptr,getTicket2,(void*)"thread 1");
    pthread_create(&t2,nullptr,getTicket2,(void*)"thread 2");
    pthread_create(&t3,nullptr,getTicket2,(void*)"thread 3");
    pthread_create(&t4,nullptr,getTicket2,(void*)"thread 4");
    pthread_join(t1,nullptr);
    pthread_join(t2,nullptr);
    pthread_join(t3,nullptr);
    pthread_join(t4,nullptr);
}
int main()
{
    //test();
    //test1();
    test2();
    return 0;
}